package pulsar

import (
	"context"
	"knowledge_admin/pkg/adapters/queue/pubsub"
	"time"

	"github.com/apache/pulsar-client-go/pulsar"
)

type message struct {
	pulsar.Message
	ctx                 context.Context
	ack                 func(pulsar.Message) error
	negativeAcknowledge func(pulsar.Message) error
	subscribeName       string
	payload             []byte
	lazyCopyPayload     bool
}

func (msg *message) Context() context.Context {
	return msg.ctx
}

func (msg *message) Ack() error {
	return msg.ack(msg.Message)
}

func (msg *message) ID() pubsub.MessageID {
	return msg.Message.ID()
}

func (msg *message) Value(value interface{}) error {
	return msg.Message.GetSchemaValue(value)
}

func (msg *message) Payload() []byte {
	if !msg.lazyCopyPayload {
		msg.lazyCopyPayload = true
		d := msg.Message.Payload()

		if d != nil {
			msg.payload = make([]byte, len(d))
			copy(msg.payload, d)
		}
	}

	return msg.payload
}

func (msg *message) EventTime() *time.Time {
	eTime := msg.Message.EventTime()
	return &eTime
}
